const TerserPlugin = require("terser-webpack-plugin");
const CompressionWebpackPlugin = require("compression-webpack-plugin");
const zopfli = require("@gfx/zopfli");
const BrotliPlugin = require("brotli-webpack-plugin");
const productionGzipExtensions = /\.(js|css|json|txt|html|ico|svg)(\?.*)?$/i;
const IS_PROD = ["production", "prod"].includes(process.env.NODE_ENV);
const BundleAnalyzerPlugin = require("webpack-bundle-analyzer").BundleAnalyzerPlugin;
// 拼接路径
const resolve = (dir) => require("path").join(__dirname, dir);

// 增加环境变量
process.env.VUE_APP_VERSION = require("./package.json").version;
process.env.VUE_APP_BUILD_TIME = require("dayjs")().format("YYYY-M-D HH:mm:ss");

// 基础路径 注意发布之前要先修改这里
let publicPath = "/";

module.exports = {
  publicPath, // 根据你的实际情况更改这里
  lintOnSave: true,
  outputDir: 'release/dist',
  productionSourceMap: false,
  devServer: {
    inline: true,
    hot: true,
    disableHostCheck: true,
    publicPath, // 和 publicPath 保持一致
    proxy: {
      "/api/api": {
        // target: "http://192.168.199.231:32150/cuser/public/index.php", // 开发环境
        target: "http://192.168.199.231:30393/cuser/public/index.php", //测试环境
        // target: "http://114.115.244.240:30362/cuser/public/index.php", //华为云环境
        // target: "https://cuser.ddmg.com", //生产环境
        changeOrigin: true,
        ws: true,
        pathRewrite: {
          "^/api": "",
        },
      },
      "/cerp_api": {
        // target: "http://192.168.199.231:32150/cerp/public/index.php", // 开发环境
         target: "http://192.168.199.231:30393/cerp/public/index.php", //测试环境
        //  target: "http://114.115.244.240:30362/cerp/public/index.php", //华为云环境
        // target: "https://cuser.ddmg.com", //生产环境
        changeOrigin: true,
        ws: true,
        pathRewrite: {
          "^/cerp_api": "",
        },
      },
    },
  },
  css: {
    // 将组件内的 CSS 提取到一个单独的 CSS 文件 (只用在生产环境中)
    // 也可以是一个传递给 `extract-text-webpack-plugin` 的选项对象
    extract: IS_PROD ? true : false,

    // 是否开启 CSS source map？
    sourceMap: false,

    // 为预处理器的 loader 传递自定义选项。比如传递给
    // sass-loader 时，使用 `{ sass: { ... } }`
    loaderOptions: {
      // 设置 scss 公用变量文件
      sass: {
        data: `@import '~@/assets/style/public.scss';`,
      },
    },
    // 为所有的 CSS 及其预处理文件开启 CSS Modules。
    // 这个选项不会影响 `*.vue` 文件。
    // modules: false,
  },
  // 默认设置: https://github.com/vuejs/vue-cli/tree/dev/packages/%40vue/cli-service/lib/config/base.js
  configureWebpack: (config) => {
    Object.assign(config, {
      // externals: {
      //   'vue-router': 'VueRouter',
      //   'vuex': 'Vuex',
      //   'axios': 'axios',
      //   'handsontable': 'Handsontable',
      //   'moment': 'moment',
      //   'crypto-js': 'CryptoJS',
      //   'echarts': 'echarts',
      // }
    });

    if (IS_PROD) {
      const plugins = [];
      //删除console插件
      plugins.push(
        new TerserPlugin({
          terserOptions: {
            compress: {
              warnings: false,
              drop_console: true,
              drop_debugger: false,
              pure_funcs: ["console.log"], //移除console
            },
          },
          sourceMap: false,
          parallel: true,
        })
      );
      //压缩插件
      // plugins.push(
      //   new CompressionWebpackPlugin({
      //     algorithm(input, compressionOptions, callback) {
      //       return zopfli.gzip(input, compressionOptions, callback);
      //     },
      //     compressionOptions: {
      //       numiterations: 15
      //     },
      //     minRatio: 0.99,
      //     test: productionGzipExtensions
      //   })
      // );
      // plugins.push(
      //   new BrotliPlugin({
      //     test: productionGzipExtensions,
      //     minRatio: 0.99
      //   })
      // );
      config.plugins = [...config.plugins, ...plugins];
    }
  },

  chainWebpack: (config) => {
    // 打包分析
    if (process.env.IS_ANALYZ) {
      config.plugin("webpack-report").use(BundleAnalyzerPlugin, [
        {
          analyzerMode: "static",
        },
      ]);
    }

    /**
     * 删除懒加载模块的 prefetch preload，降低带宽压力
     * https://cli.vuejs.org/zh/guide/html-and-static-assets.html#prefetch
     * https://cli.vuejs.org/zh/guide/html-and-static-assets.html#preload
     * 而且预渲染时生成的 prefetch 标签是 modern 版本的，低版本浏览器是不需要的
     */
    config.plugins.delete("prefetch").delete("preload");
    // 解决 cli3 热更新失效 https://github.com/vuejs/vue-cli/issues/1559
    config.resolve.symlinks(true);
    config
      // 开发环境
      .when(
        process.env.NODE_ENV === "development",
        // sourcemap不包含列信息
        (config) => config.devtool("cheap-source-map")
      )
      // 非开发环境
      .when(process.env.NODE_ENV !== 'development', (config) => {
        config.plugin("ScriptExtHtmlWebpackPlugin").use("script-ext-html-webpack-plugin", [
          {
            // `runtime` must same as runtimeChunk name. default is `runtime`
            inline: /runtime\..*\.js$/,
          },
        ]);
        config.optimization.splitChunks({
          chunks: "all",
          cacheGroups: {
            libs: {
              name: "chunk-libs",
              test: /[\\/]node_modules[\\/]/,
              priority: 10,
              chunks: "initial", // 只打包初始时依赖的第三方
            },
            elementUI: {
              name: "chunk-elementUI", // 单独将 elementUI 拆包
              priority: 20, // 权重要大于 libs 和 app 不然会被打包进 libs 或者 app
              test: /[\\/]node_modules[\\/]element-ui[\\/]/,
            },
            commons: {
              name: "chunk-commons",
              test: resolve("src/components"), // 可自定义拓展你的规则
              minChunks: 3, // 最小公用次数
              priority: 5,
              reuseExistingChunk: true,
            },
          },
        });
        config.optimization.runtimeChunk("single");
      });
    // markdown
    // config.module
    //   .rule("md")
    //   .test(/\.md$/)
    //   .use("text-loader")
    //   .loader("text-loader")
    //   .end();
    // i18n
    // config.module
    //   .rule("i18n")
    //   .resourceQuery(/blockType=i18n/)
    //   .use("i18n")
    //   .loader("@kazupon/vue-i18n-loader")
    //   .end();
    // svg

    // const svgRule = config.module.rule("svg");
    // svgRule.uses.clear();
    // svgRule.include
    //   .add(resolve("src/assets/svg-icons/icons"))
    //   .end()
    //   .use("svg-sprite-loader")
    //   .loader("svg-sprite-loader")
    //   .options({
    //     symbolId: "d2-[name]",
    //   })
    //   .end();
    // image exclude
    const imagesRule = config.module.rule("images");
    imagesRule
      .test(/\.(png|jpe?g|gif|webp|svg)(\?.*)?$/)
      .exclude.add(resolve("src/assets/svg-icons/icons"))
      .end();
    // 重新设置 alias
    config.resolve.alias.set("@api", resolve("src/api"));
    // node
    config.node.set("__dirname", true).set("__filename", true);
    // 判断环境加入模拟数据
    // config.resolve("/node_modules/element-ui/src");
    // config.resolve("/node_modules/element-ui/packages"); //---添加这行
    // const entry = config.entry("app");
    // if (process.env.VUE_APP_BUILD_MODE !== "nomock") {
    //   entry.add("@/mock").end();
    // }
  },
};
